]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
userMenu: Don't update the presence icon immediately
authorJasper St. Pierre <jstpierre@mecheye.net>
Sat, 1 Sep 2012 22:15:42 +0000 (19:15 -0300)
committerJasper St. Pierre <jstpierre@mecheye.net>
Tue, 4 Sep 2012 21:42:45 +0000 (18:42 -0300)
If we don't freeze the presence icon, we can end up in a place where
we'll be updating the icon before we fade out the panel indicators when
coming back from the lock screen.

https://bugzilla.gnome.org/show_bug.cgi?id=683156

js/ui/panel.js
js/ui/panelMenu.js
js/ui/userMenu.js

index 5c4a0b2e08a4e20c232c3b9bc56098d3b82610e9..2e14c2277e2b04fabc91c9edca47b7507d7a0ff4 100644 (file)
@@ -1131,7 +1131,7 @@ const Panel = new Lang.Class({
     },
 
     _tweenAndUpdatePanel: function() {
-        this._closeIndicatorMenus();
+        this._freezeAndCloseIndicators();
 
         Tweener.addTween(this, {
             boxOpacity: 0,
@@ -1140,6 +1140,7 @@ const Panel = new Lang.Class({
             onCompleteScope: this,
             onComplete: function() {
                 this._updatePanel();
+                this._thawIndicators();
                 Tweener.addTween(this, {
                     boxOpacity: 255,
                     time: Overview.ANIMATION_TIME / 2,
@@ -1153,13 +1154,21 @@ const Panel = new Lang.Class({
         this._tweenAndUpdatePanel();
     },
 
-    _closeIndicatorMenus: function() {
+    _freezeAndCloseIndicators: function() {
         for (let role in this.statusArea) {
             let indicator = this.statusArea[role];
+            indicator.freeze();
             indicator.menu.close();
         }
     },
 
+    _thawIndicators: function() {
+        for (let role in this.statusArea) {
+            let indicator = this.statusArea[role];
+            indicator.thaw();
+        }
+    },
+
     _hideIndicators: function() {
         for (let role in PANEL_ITEM_IMPLEMENTATIONS) {
             let indicator = this.statusArea[role];
index 0476375f5743d404bfc25cf3a71a0abc9bbe53f7..1cad7c89430730389f1f7343645177bd7c44caf6 100644 (file)
@@ -113,6 +113,21 @@ const Button = new Lang.Class({
             this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
 
         this.setName(nameText);
+        this._frozenCount = 0;
+    },
+
+    freeze: function() {
+        this._frozenCount++;
+    },
+
+    thaw: function() {
+        this._frozenCount--;
+        if (this._frozenCount == 0)
+            this.emit('thawed');
+    },
+
+    get frozen() {
+        return this._frozenCount > 0;
     },
 
     setSensitive: function(sensitive) {
index bb3e1a5d92d93fe930f81d84b9ed2ff024bca734..ab35089b64ca2737080d556ae51a910b047ad193 100644 (file)
@@ -574,6 +574,8 @@ const UserMenuButton = new Lang.Class({
 
         Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
         this._sessionUpdated();
+
+        this.connect('thawed', Lang.bind(this, this._onThawed));
     },
 
     _sessionUpdated: function() {
@@ -666,6 +668,9 @@ const UserMenuButton = new Lang.Class({
     },
 
     _updatePresenceIcon: function(accountMgr, presence, status, message) {
+        if (this.frozen)
+            return;
+
         if (Main.sessionMode.isLocked)
             this._iconBox.child = this._lockedIcon;
         else if (presence == Tp.ConnectionPresenceType.AVAILABLE)
@@ -798,6 +803,10 @@ const UserMenuButton = new Lang.Class({
         this._presence.status = status;
     },
 
+    _onThawed: function() {
+        this._updatePresenceIcon();
+    },
+
     _onMyAccountActivate: function() {
         Main.overview.hide();
         let app = Shell.AppSystem.get_default().lookup_setting('gnome-user-accounts-panel.desktop');